/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.cont.manager;

import com.brain.cont.dto.PlanContableDetaDto;
import com.brain.cont.dto.PlanContableDto;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.sele.view.util.ConstantesSele;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.stereotype.Service;

/**
 *
 * @author Hvives
 */
@Service
public class PlanContableDetaManager extends ComunManager<PlanContableDetaDto> implements Serializable {

    private static Logger logger = Logger.getLogger(PlanContableDetaManager.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private PlanContableManager planContableManager;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private DAOGenerico<PlanContableDetaDto> springHibernateDao;
    private final Long idEntidad = 404L;
    private String urlLista = "/pages/cont/plancontable/listaCuentas.xhtml";
    private String urlPrincipal = "/pages/cont/plancontable/cuenta.xhtml";

    public PlanContableDetaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PlanContableDetaDto.class, id);
    }

    public PlanContableDetaDto guardar(PlanContableDetaDto dto) throws DAOException {
        PlanContableDetaDto to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        dto.setTerminal(sessionMBean.getSessionTerminal());
        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
        if (valExisteCuenta(dto)) {
            //  System.out.println(validarCuenta(dto.getCuenta()));
            if (sessionMBean.getAccion() == ConstantesSele.Formulario.NUEVO) {
                dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                try {                 
                    nuevo(dto);
                    to = dto;
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                } catch (DAOException ex) {
                    logger.error(ex);
                    recursosManager.showError(ex.getMessage());
                }
            } else if (sessionMBean.getAccion() == ConstantesSele.Formulario.EDITAR) {
                try {
                    editar(dto);
                    to = dto;
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                } catch (DAOException ex) {
                    logger.error(ex);
                    recursosManager.showError(ex.getMessage());
                }

            }
        } else {
            recursosManager.showError("NO SE PUEDE DUPLICAR EL NÚMERO DE CUENTA");
        }
        return to;
    }
    
    public boolean valExisteCuenta(PlanContableDetaDto d) {        
        Long num = null;
        String sql = "select pck_util_contabilidad.valida_existe_cuenta(" + d.getPlanContableDto().getId()+",'"+d.getCuenta()+"',"+d.getId()+ ") from dual";
        String resultado = null;
        List lista;
        try {
            lista = springHibernateDao.ejecutarSQL(sql);
            for (Iterator iter = lista.iterator(); iter.hasNext();) {
                StringTokenizer registro = new StringTokenizer(iter.next().toString(), "|");
                resultado = registro.nextToken();
                break;
            }
            num = Long.valueOf(resultado);
            
            if (num.equals(Long.valueOf(1))){
                return false;
            }else {
                return true;
            }
            
        } catch (DAOException ex) {
            return false;
        }


    }

    public boolean validarCuenta(Long idPlan, String cuenta, Long idCuenta) throws DAOException {
        return true;
        /* String hql = "Select e from PlanContableDetaDto e where e.id = e.id and e.cuenta = '" + cuenta.trim() +"' and e.planContableDto.id ="+idPlan ;
         if (idCuenta != null) {
         hql = " and e.id != " + idCuenta;
         }
         List<PlanContableDetaDto> l = new ArrayList<PlanContableDetaDto>();
         l = springHibernateDao.ejecutarQuery(hql);
        
         if (l == null || l.isEmpty()) {
         return true;
         } else {
         return false;
         }*/
    }

    public List<PlanContableDetaDto> obtenerListaCuentasPadresMemoria(List<PlanContableDetaDto> lista, PlanContableDetaDto filtro) throws DAOException {
        List<PlanContableDetaDto> l = new ArrayList<PlanContableDetaDto>();

        for (PlanContableDetaDto p : lista) {
            if (!p.getId().equals(filtro.getId())) {
                l.add(p);
            }
        }
        //sacamos los hijos para evitar bucle cerrado

        List<PlanContableDetaDto> lh1 = obtenerCuentasHijosMemoria(lista, filtro);
        l.removeAll(lh1);
        if (lh1.size() > 0) {
            for (PlanContableDetaDto p1 : lh1) {
                List<PlanContableDetaDto> lh2 = obtenerCuentasHijosMemoria(lista, p1);
                l.removeAll(lh2);
            }
        }

        return l;
    }

    public List<PlanContableDetaDto> obtenerCuentasHijosMemoria(List<PlanContableDetaDto> lista, PlanContableDetaDto filtro) throws DAOException {
        List<PlanContableDetaDto> l = new ArrayList<PlanContableDetaDto>();
//        for (PlanContableDetaDto p : lista) {
//             if (p.getCuentaPadreDto().getCuenta().equals(filtro.getCuenta())) {
//                 l.add(p);
//             }
//         }        
        return l;
    }

    public List<PlanContableDetaDto> obtenerListaCuentasPadres(PlanContableDetaDto d) throws DAOException {
        int cont = 0;
        Long x = Long.valueOf(-1);

        if (d.getId() != null) {
            x = d.getId();
        }

        String hql = "Select e from PlanContableDetaDto e where e.id = e.id and e.cuenta !=" + d.getCuenta() + " and e.planContableDto.id =" + d.getPlanContableDto().getId() + " and e.id != " + x;
        if (d.getId() != null) {
            if (obtenerCuentasHijos(d) != null && obtenerCuentasHijos(d).size() > 0) {
                for (PlanContableDetaDto f : obtenerCuentasHijos(d)) {
                    hql = "and e.id != " + f.getId();
                    if (obtenerCuentasHijos(f) != null && obtenerCuentasHijos(f).size() > 0) {
                        for (PlanContableDetaDto f1 : obtenerCuentasHijos(f)) {
                            hql = "and e.id != " + f1.getId();
                            if (obtenerCuentasHijos(f1) != null && obtenerCuentasHijos(f1).size() > 0) {
                                for (PlanContableDetaDto f2 : obtenerCuentasHijos(f1)) {
                                    hql = "and e.id != " + f2.getId();
                                }
                            }
                        }
                    }
                }
            }
        }


        List<PlanContableDetaDto> l = new ArrayList<PlanContableDetaDto>();
        l = springHibernateDao.ejecutarQuery(hql);

        return l;
    }

    public List<PlanContableDetaDto> obtenerCuentasHijos(PlanContableDetaDto d) throws DAOException {
        // String hql = "Select e from PlanContableDetaDto e where e.id = e.id and e.cuentaPadreDto.cuenta =" + d.getCuenta() +" and e.planContableDto.id ="+d.getPlanContableDto().getId();        
        List<PlanContableDetaDto> l = new ArrayList<PlanContableDetaDto>();
        //l = springHibernateDao.ejecutarQuery(hql);

        return l;
    }

    public List<PlanContableDetaDto> buscar(PlanContableDetaDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hsql = "select e from PlanContableDetaDto e where e.id = e.id ";
        if (dto.getId() != null && !dto.getId().equals(0L)) {
            hsql += " and e.id = ?";
            listaParametros.add(dto.getId());
        }
        hsql += " and upper(e.cuenta) != '" + "-1" + "'";

        if (dto.getCuenta() != null && dto.getCuenta().length() != 0) {
            hsql += " and upper(e.cuenta) like '" + dto.getCuenta() + "%'";
        }

        if (dto.getDescripcion() != null && dto.getDescripcion().length() != 0) {
            hsql += " and upper(e.descripcion) like '%" + dto.getDescripcion() + "%'";
        }

        if (dto.getClase() != null && !dto.getClase().equals(Long.valueOf(-1))) {
            hsql += " and e.clase  = ?";
            listaParametros.add(dto.getClase());
        }

        if (dto.getTipo() != null && !dto.getTipo().equals(String.valueOf("-1"))) {
            hsql += " and upper(e.tipo) like '" + dto.getTipo() + "'";
        }

        if (dto.getEstructura() != null && !dto.getEstructura().equals(String.valueOf("-1"))) {
            hsql += " and upper(e.estructura) like '" + dto.getEstructura() + "'";
        }

        hsql += " and e.planContableDto.id = ?";
        listaParametros.add(dto.getPlanContableDto().getId());

      /*  hsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        
        hsql += " and e.organizacionDto.id = ?";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        */
        hsql += " order by e.cuenta asc";
        return springHibernateDao.ejecutarQuery(hsql, listaParametros);
    }

    public List<PlanContableDetaDto> autoCompletarCuenta(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "Select e from PlanContableDetaDto e where e.id = e.id ";
        hqsql += " and e.estado = 1 and upper(e.cuenta || e.descripcion) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " and e.organizacionDto.id = " + sessionMBean.getOrganizacionDto().getId() ;
        hqsql += " and e.planContableDto.id = " + sessionMBean.getOrganizacionDto().getPlanContableDto().getId() ;
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql);
    }

    public List<PlanContableDetaDto> obtenerCuentasContablesPorOrganizacion(Long idOrganizacion) throws DAOException {
        OrganizacionDto dto = organizacionManager.obtenerPorId(idOrganizacion);
        PlanContableDto p = planContableManager.obtenerPLanContableOrganizacion(dto);
        return obtenerCuentasContablesPorPlan(p.getId());
    }    

    public List<PlanContableDetaDto> obtenerCuentasContablesPorPlan(Long idPlanContable) throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("planContableDto.id", idPlanContable);        
        filtros.put("indRegistro", Boolean.TRUE);        
        Map<String, String> orden = new HashMap<String, String>();
        orden.put("cuenta", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(PlanContableDetaDto.class, filtros, orden);
    }

    public List<PlanContableDetaDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(PlanContableDetaDto.class, filtros, orden);
    }

    public void nuevoMuchos(List<PlanContableDetaDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<PlanContableDetaDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public SelectItem[] siTipos() {
        SelectItem[] si = new SelectItem[7];
        si[0] = new SelectItem("O", "ORDEN");
        si[1] = new SelectItem("A", "ACTIVO");
        si[2] = new SelectItem("P", "PASIVO");
        si[3] = new SelectItem("R", "RESULTADOS");
        si[4] = new SelectItem("N", "GASTOS");
        si[5] = new SelectItem("F", "FUNCION");
        si[6] = new SelectItem("M", "MAYOR");

        return si;
    }

    public SelectItem[] siClases() {
        SelectItem[] si = new SelectItem[9];
        si[0] = new SelectItem("1", "1");
        si[1] = new SelectItem("2", "2");
        si[2] = new SelectItem("3", "3");
        si[3] = new SelectItem("4", "4");
        si[4] = new SelectItem("5", "5");
        si[5] = new SelectItem("6", "6");
        si[6] = new SelectItem("7", "7");
        si[7] = new SelectItem("8", "8");
        si[8] = new SelectItem("9", "9");


        return si;
    }

    public SelectItem[] siEstructura() {
        SelectItem[] si = new SelectItem[6];
        si[0] = new SelectItem("E", "ELEMENTO");
        si[1] = new SelectItem("G", "GRUPO");
        si[2] = new SelectItem("C", "CUENTA");
        si[3] = new SelectItem("S1", "SUB CUENTA 1");
        si[4] = new SelectItem("S2", "SUB CUENTA 2");
        si[5] = new SelectItem("S3", "SUB CUENTA 3");

        return si;
    }

    public SelectItem[] siTiposFiltro() {
        SelectItem[] si = new SelectItem[8];
        si[0] = new SelectItem("-1", "TODOS");
        si[1] = new SelectItem("O", "ORDEN");
        si[2] = new SelectItem("A", "ACTIVO");
        si[3] = new SelectItem("P", "PASIVO");
        si[4] = new SelectItem("R", "RESULTADOS");
        si[5] = new SelectItem("N", "GASTOS");
        si[6] = new SelectItem("F", "FUNCION");
        si[7] = new SelectItem("M", "MAYOR");

        return si;
    }

    public SelectItem[] siClasesFiltro() {
        SelectItem[] si = new SelectItem[10];
        si[0] = new SelectItem("-1", "TODOS");
        si[1] = new SelectItem("1", "1");
        si[2] = new SelectItem("2", "2");
        si[3] = new SelectItem("3", "3");
        si[4] = new SelectItem("4", "4");
        si[5] = new SelectItem("5", "5");
        si[6] = new SelectItem("6", "6");
        si[7] = new SelectItem("7", "7");
        si[8] = new SelectItem("8", "8");
        si[9] = new SelectItem("9", "9");


        return si;
    }

    public SelectItem[] siEstructuraFiltro() {
        SelectItem[] si = new SelectItem[7];
        si[0] = new SelectItem("-1", "TODOS");
        si[1] = new SelectItem("E", "ELEMENTO");
        si[2] = new SelectItem("G", "GRUPO");
        si[3] = new SelectItem("C", "CUENTA");
        si[4] = new SelectItem("S1", "SUB CUENTA 1");
        si[5] = new SelectItem("S2", "SUB CUENTA 2");
        si[6] = new SelectItem("S3", "SUB CUENTA 3");

        return si;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public void setUrlLista(String urlLista) {
        this.urlLista = urlLista;
    }

    public String getUrlPrincipal() {
        return urlPrincipal;
    }

    public void setUrlPrincipal(String urlPrincipal) {
        this.urlPrincipal = urlPrincipal;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }
}
